# -*-coding:utf-8 -*- #
# ---------------------------------------------------------------------------
# ProjectName:   selenium_self
# FileName:      read_excel.py
# Author:       test_liu
# Datetime:     2024/10/14 下午8:20
# Description: 读取excel文件
# ---------------------------------------------------------------------------
import openpyxl

from WebTest3.WebTest import log
from WebTest3.WebTest.common.read_json import read_json
from WebTest3.WebTest.common.read_user_ini import ReadUserIni


class Excel:
    def __init__(self, excel_name, table_name, user_dir):
        read_user_ini = ReadUserIni(user_dir)
        # 读取所有json文件
        self.case_data_dict = read_json('case', user_dir)
        self.expect_data_dict = read_json('expect', user_dir)
        self.sql_data_dict = read_json('sql', user_dir)
        # 获取excel文件路径
        excel_path = read_user_ini.get_file_path(excel_name)
        # 获取表格名称
        table_name = read_user_ini.get_table_name(table_name)
        # 打开excel文件
        try:
            self.wb = openpyxl.load_workbook(excel_path)
            self.ws = self.wb[table_name]
        except Exception as e:
            log.error(f'打开excel文件错误，文件路径：{excel_path}，表格名称：{table_name}，错误信息为{e}')
            raise e

    def __get_cell_value(self, row, column):
        try:
            # 获取单元格数据（之后的函数都要用到，为空则返回None）
            cell_value = self.ws[column + str(row)].value
        except Exception as e:
            log.error(f'读取excel错误，单元格行数：{row}，列数：{column}，错误信息为{e}')
            raise e
        else:
            if cell_value is None:
                return None
            elif cell_value.strip():
                return cell_value.strip()

    def number(self, row):
        # 获取用例编号
        return self.__get_cell_value(row, 'A')

    def module(self, row):
        # 获取模块
        return self.__get_cell_value(row, 'B')

    def func_name(self, row):
        # 获取功能模块
        return self.__get_cell_value(row, 'C')

    def title(self, row):
        # 获取用例名称
        return self.__get_cell_value(row, 'D')

    def level(self, row):
        # 获取用例等级
        return self.__get_cell_value(row, 'E')

    def case_data(self, row):
        # 获取用例数据
        key = self.__get_cell_value(row, 'F')
        if key:
            module = self.module(row)
            func_name = self.func_name(row)
            try:
                return self.case_data_dict[module][func_name][key]
            except Exception as e:
                log.error(f'读取json文件错误，在case.json中数据：[{module}-{func_name}-{key}]，错误信息为{e}')
                raise e

    def expect_data(self, row):
        # 获取期望数据
        key = self.__get_cell_value(row, 'G')
        if key:
            module = self.module(row)
            func_name = self.func_name(row)
            try:
                return self.expect_data_dict[module][func_name][key]
            except Exception as e:
                log.error(f'读取json文件错误，在expect.json中数据：[{module}-{func_name}-{key}]，错误信息为{e}')
                raise e

    def sql_data(self, row):
        # 获取sql数据
        key = self.__get_cell_value(row, 'H')
        if key:
            module = self.module(row)
            func_name = self.func_name(row)
            try:
                return self.sql_data_dict[module][func_name][key]
            except Exception as e:
                log.error(f'读取json文件错误，在sql.json中数据：[{module}-{func_name}-{key}]，错误信息为{e}')
                raise e

    def get_data(self):
        # 获取除等级之外的所有数据
        # 最大行数
        row = self.ws.max_row
        data_list = []
        for i in range(2, row + 1):
            num = self.number(i)
            module = self.module(i)
            func_name = self.func_name(i)
            title = self.title(i)
            # level = self.level(i)
            case_data = self.case_data(i)
            expect_data = self.expect_data(i)
            sql_data = self.sql_data(i)
            data_list.append([num, module, func_name, title, case_data, expect_data, sql_data])
        log.info(f'获取excel所有数据成功！')
        return data_list


if __name__ == '__main__':
    excel = Excel('excel', 'sheet1', 'test_han')
    print(excel.get_data())
